// 缓存工具类
// 用于实现前端数据缓存，减少重复请求

interface CacheItem<T> {
  data: T
  timestamp: number
  expiry: number // 过期时间（毫秒）
}

export class Cache {
  private static readonly PREFIX = 'cache:'

  /**
   * 设置缓存
   * @param key 缓存键
   * @param data 缓存数据
   * @param expiry 过期时间（毫秒），默认5分钟
   */
  static set<T>(key: string, data: T, expiry: number = 5 * 60 * 1000): void {
    try {
      const cacheItem: CacheItem<T> = {
        data,
        timestamp: Date.now(),
        expiry
      }
      localStorage.setItem(`${this.PREFIX}${key}`, JSON.stringify(cacheItem))
    } catch (error) {
      console.warn('缓存设置失败:', error)
    }
  }

  /**
   * 获取缓存
   * @param key 缓存键
   * @returns 缓存数据，如果不存在或已过期则返回null
   */
  static get<T>(key: string): T | null {
    try {
      const cachedData = localStorage.getItem(`${this.PREFIX}${key}`)
      if (!cachedData) return null

      const cacheItem: CacheItem<T> = JSON.parse(cachedData)
      const now = Date.now()
      
      // 检查缓存是否过期
      if (now - cacheItem.timestamp > cacheItem.expiry) {
        this.remove(key)
        return null
      }
      
      return cacheItem.data
    } catch (error) {
      console.error('解析缓存数据失败:', error)
      this.remove(key)
      return null
    }
  }

  /**
   * 移除缓存
   * @param key 缓存键
   */
  static remove(key: string): void {
    localStorage.removeItem(`${this.PREFIX}${key}`)
  }

  /**
   * 清除所有缓存
   */
  static clear(): void {
    Object.keys(localStorage).forEach(key => {
      if (key.startsWith(this.PREFIX)) {
        localStorage.removeItem(key)
      }
    })
  }

  /**
   * 清除特定前缀的缓存
   * @param prefix 缓存键前缀
   */
  static clearWithPrefix(prefix: string): void {
    Object.keys(localStorage).forEach(key => {
      if (key.startsWith(`${this.PREFIX}${prefix}`)) {
        localStorage.removeItem(key)
      }
    })
  }

  /**
   * 检查缓存是否存在且未过期
   * @param key 缓存键
   * @returns 是否存在有效缓存
   */
  static has(key: string): boolean {
    return this.get(key) !== null
  }

  /**
   * 获取缓存大小（字节）
   * @returns 缓存占用的存储空间大小
   */
  static getSize(): number {
    let size = 0
    Object.keys(localStorage).forEach(key => {
      if (key.startsWith(this.PREFIX)) {
        size += localStorage.getItem(key)?.length || 0
      }
    })
    return size
  }
}